/**
  * Author: Mei
  * Date: 2020-11-28 20:26
  * Description: 实现一个线程安全的队列
  *
  */
#ifndef SAFEQUEUE_H
#define SAFEQUEUE_H

#include <mutex>
#include <queue>

//创建模板类
template<typename T>
class SafeQueue {
private:
    std::queue<T> m_queue;
    std::mutex m_mutex;
public:
    SafeQueue() {
    }
    SafeQueue(const SafeQueue &other) {
    }
    ~SafeQueue() {
    }
    //判断队列是否为空
    bool empty() {
        std::unique_lock<std::mutex> lock(m_mutex); //函数结束后会自动释放互斥量
        return m_queue.empty();
    }
    //判断队列的大小
    int size() {
        std::unique_lock<std::mutex> lock(m_mutex);
        return m_queue.size();
    }
    //添加进队列
    void enqueue(T &t) {
        std::unique_lock<std::mutex> lock(m_mutex);
        m_queue.push(t);
    }
    //出队列
    bool dequeue(T &t) {
        std::unique_lock<std::mutex> lock(m_mutex);
        if(m_queue.empty()) {
            return false;
        }
        t = std::move(m_queue.front()); //允许取出一个对象 当做右值使用
        m_queue.pop(); //取出头部元素
        return true;
    }

};


#endif


